package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import educar.db.JPA;

public class Cargo {
	private String nro_cargo;
	private String codigo;
	private String descripcion;
	private static JPA jpa= new JPA();
	
	
	/**
	 * metodo constructor de la clase, crea un nuevo Cargo
	 * @param newCodigo "String que contiene el codigo de cada facultad" 
	 * @param newDescripcion "String que contiene la descripcion de cada facultad"
	 */	
	public Cargo (String newNro,String codigo, String descripcion){
		setNroCargo(newNro);
		setCodigo(codigo);
		setDescripcion(descripcion);
	}
	
	/**
	 * permite establecer el numero de un cargo
	 * @param newCodigo "String que cotiene el codigo de cada cargo"
	 */
	public void setNroCargo(String newNro){
		nro_cargo = newNro;
	}
	
	/**
	 * retorna el numero del cargo dado
	 * @return String con el codigo
	 */
	public String getNroCargo(){
		return nro_cargo;
	}
	
	
	/**
	 * permite establecer el codigo de un cargo
	 * @param newCodigo "String que cotiene el codigo de cada cargo"
	 */
	public void setCodigo(String newCodigo){
		codigo= newCodigo;
	}
	
	/**
	 * retorna el codigo del cargo dado
	 * @return String con el codigo
	 */
	public String getCodigo(){
		return codigo;
	}
	
	/**
	 * permite establecer la descripcion del cargo
	 * @param newDescripcion "String que cotiene la descripcion del cargo"
	 */
	public void setDescripcion (String newDescripcion){
		descripcion= newDescripcion;
	}
	
	/**
	 * retorna la descripcion del cargo
	 * @return String con la descripcion
	 */
	public String getDescripcion(){
		return descripcion;
	}
	
	/**
	 * Permite guardar un cargo en la base de datos
	 * @return true o false dependiendo exito o fracaso
	 */
	public boolean save() {
		try {
			Cargo.getCargoByCodigo(getCodigo());
			return false;
		} catch (cargoNotFound e1) {
			String[] columns = { "cod_cargo", "descripcion"};
			PreparedStatement stm = jpa.newRecord("cargo", columns);
			try {
				stm.setString(1, codigo);
				stm.setString(2, descripcion);	
			} catch (SQLException e) {
				e.printStackTrace();
				return false;
			}
			jpa.create(stm);
			return true;
		}
	}

	/**
	 * permite borrar un cargo de la base de datos
	 */
	public void destroy() {
		try {
			jpa.destroy("cargo", "cod_cargo", getCodigo());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * permite actualizar un cargo en la base de datos
	 * @return booleano segun exito o fracaso
	 */
	public boolean update() {
		try {
			String[] datos = {this.getCodigo(),this.getDescripcion()};
			String[] columns = { "cod_cargo","descripcion" };
			jpa.update("cargo", columns, datos, "nro_cargo", this.getNroCargo());
			return true;
		} catch(Exception ex) {
			return false;
		}
	}
	
	/**
	 * retorna un objeto cargo dado el codigo del cargo
	 * @param codigo string con el codigo del cargo
	 * @return objeto Cargo
	 * @throws cargoNotFound error cargo no existe
	 */
	public static Cargo getCargoByCodigo(String codigo) throws cargoNotFound {
		ResultSet rs = null;
		Cargo t = null;
		rs = jpa.getByField("cargo", "cod_cargo", codigo);
		try {
			if (rs.next()) {
				t = new Cargo(rs.getString(1), rs.getString(2),rs.getString(3));
			} 
			else {
				throw new cargoNotFound();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return t;
	}

	/**
	 * Obtiene la lista de cargos disponibles
	 * @return Array de Cargos
	 */
	public static Cargo[] getCargoList() {
		String[][] result = jpa.ResultSetToStringArray(jpa.showProyection("cargo", "cod_cargo"));
		Cargo[] cargosList = new Cargo[result.length];
		for (int i=0;i<result.length;i++) {
			try {
				cargosList[i] = Cargo.getCargoByCodigo(result[i][0]);
			} catch (cargoNotFound e1) {
				e1.printStackTrace();
			}
		}
		return cargosList;
	}
	
	/**
	 * obtiene la tabla cargo
	 * @return Object[][] matriz con la tabla cargo
	 */
	public static Object[][] getCargoTable(){
		Object[][] cargoTable = jpa .ResultSetToArray(jpa.showAll("cargo"));
		return cargoTable;
	}
	
	
	/**
	 * Compara objetos del tipo cargo	
	 */
	public boolean equals(Object arg0) {
		if (arg0==null) {
			return false;
		}
		if (this.getCodigo().equals(((Cargo) arg0).getCodigo())) {
			return true;
		}
		return false;		
	}
	
	
	/**
	 * Redefinicion del metodo convertir a cadena
	 */
	public String toString() {
		return this.getCodigo()+" -- "+this.getDescripcion();
	}
	
	
	/**
	 * Metodo utilizado en la busqueda
	 * @param arg0 string a buscar
	 * @return boolean si es parecido o no
	 */
	public boolean comparar(String arg0) {
		String busq = arg0.toLowerCase();
		String cod = this.getCodigo().toLowerCase();
		String nam = this.getDescripcion().toLowerCase();
		return (busq.equals(cod) || busq.equals(nam));
	}
}